Authentication এবং Authorization দুটি গুরুত্বপূর্ণ সিকিউরিটি প্রক্রিয়া যা যেকোনো ওয়েব অ্যাপ্লিকেশনে সুরক্ষা নিশ্চিত করতে ব্যবহৃত হয়। যদিও এগুলি একে অপরের সাথে সম্পর্কিত, তবে তাদের কাজ ভিন্ন।
Authentication
Authentication হলো প্রক্রিয়া যার মাধ্যমে একটি সিস্টেম নিশ্চিত করে যে, একজন ব্যবহারকারী সঠিক এবং বৈধ। এটি ব্যবহারকারীর পরিচয় যাচাই করার প্রক্রিয়া। এক্ষেত্রে, ব্যবহারকারীর পরিচয় প্রমাণের জন্য সাধারণত ইউজারনেম এবং পাসওয়ার্ড ব্যবহার করা হয়। ASP.Net Core-এ Authentication প্রক্রিয়া বাস্তবায়নের জন্য বিভিন্ন পদ্ধতি রয়েছে, যেমন:
Forms Authentication
Forms Authentication ব্যবহারকারীকে একটি লগইন পৃষ্ঠায় নিয়ে যায় যেখানে ব্যবহারকারী তাদের ইউজারনেম এবং পাসওয়ার্ড প্রদান করে। লগইন সঠিক হলে, ASP.Net Core একটি সেশন তৈরি করে যা পরবর্তী অনুরোধে ব্যবহারকারীর পরিচয় যাচাই করে।
JWT (JSON Web Token) Authentication
JWT Authentication ব্যবহারকারীর পরিচয় প্রমাণ করতে একটি JSON Web Token ব্যবহার করে। এটি সাধারণত API অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয় যেখানে সেশন ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ নয় এবং RESTful API-তে টোকেনের মাধ্যমে ব্যবহারকারীকে বৈধ করা হয়। JWT একটি নিরাপদ এবং হালকা পদ্ধতি।
Windows Authentication
Windows Authentication ব্যবহারকারীর উইন্ডোজ অ্যাকাউন্টের উপর ভিত্তি করে ব্যবহারকারীকে স্বীকৃতি দেয়। এটি সাধারণত ইনট্রানেট অ্যাপ্লিকেশনে ব্যবহৃত হয়।
External Authentication Providers
ASP.Net Core বিভিন্ন তৃতীয় পক্ষের সেবা যেমন Google, Facebook, GitHub, এবং Microsoft Identity প্ল্যাটফর্মের মাধ্যমে External Authentication সমর্থন করে। এই প্রক্রিয়ায়, ব্যবহারকারী তাদের তৃতীয় পক্ষের অ্যাকাউন্টের মাধ্যমে লগইন করতে পারেন।
Authorization
Authorization হলো প্রক্রিয়া যার মাধ্যমে একটি সিস্টেম যাচাই করে, ব্যবহারকারী বা ব্যবহারকারীর গ্রুপের কাছে নির্দিষ্ট রিসোর্স অ্যাক্সেস করার অনুমতি রয়েছে কিনা। Authentication প্রক্রিয়ার পরে Authorization ঘটে। এটি সাধারণত "কার জন্য কি কিছু অনুমতি দেওয়া হবে?"—এই প্রশ্নের উত্তর দেয়।
ASP.Net Core-এ Authorization এর জন্য মূলত দুটি পদ্ধতি রয়েছে:
Role-based Authorization
Role-based Authorization ব্যবহারকারীকে বিভিন্ন "রোল"-এ ভাগ করে এবং সেই রোল অনুযায়ী অ্যাক্সেস নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, একজন অ্যাডমিন ব্যবহারকারী সম্পূর্ণ অ্যাক্সেস পেতে পারে, কিন্তু সাধারণ ব্যবহারকারী শুধুমাত্র নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে পারে।
[Authorize(Roles = "Admin")]
public IActionResult AdminDashboard()
{
return View();
}
এখানে, শুধুমাত্র "Admin" রোলের ব্যবহারকারীরা এই অ্যাকশনে অ্যাক্সেস পাবে।
Policy-based Authorization
Policy-based Authorization ব্যবহারকারীদের নির্দিষ্ট শর্তের উপর ভিত্তি করে অনুমতি প্রদান করে। একটি পলিসি সাধারণত একাধিক কন্ডিশন নিয়ে তৈরি হয়। উদাহরণস্বরূপ, আপনি একটি পলিসি তৈরি করতে পারেন যা যাচাই করে যে ব্যবহারকারীর বয়স ১৮ বছরের বেশি কি না, অথবা ব্যবহারকারী একটি নির্দিষ্ট ইমেইল ডোমেইনে কাজ করে কিনা।
[Authorize(Policy = "Over18")]
public IActionResult RestrictedPage()
{
return View();
}
এখানে, পলিসি Over18 ব্যবহারকারীকে যাচাই করে এবং অনুমতি দেয় যদি তার বয়স ১৮ বছর বা তার বেশি হয়।
Claims-based Authorization
Claims-based Authorization হচ্ছে একটি আধুনিক পদ্ধতি, যেখানে ব্যবহারকারীর পরিচয়ে থাকা একাধিক দাবির (Claims) ভিত্তিতে নির্দিষ্ট অ্যাক্সেস অনুমতি দেওয়া হয়। Claims হলো ব্যবহারকারীর সম্পর্কিত তথ্য যেমন নাম, ইমেইল, জন্মতারিখ, রোল ইত্যাদি।
[Authorize(Claims = "Permission", Value = "CanEdit")]
public IActionResult Edit()
{
return View();
}
এখানে, ব্যবহারকারীর Claims এর মধ্যে "Permission" নামক Claim এর মান যদি "CanEdit" থাকে, তবে শুধুমাত্র তাকে এডিট করার অনুমতি দেওয়া হবে।
ASP.Net Core Identity ব্যবহার
ASP.Net Core Identity হলো একটি শক্তিশালী ফ্রেমওয়ার্ক যা Authentication এবং Authorization ব্যবস্থাপনা করতে সাহায্য করে। এটি ব্যবহারকারীদের রেজিস্ট্রেশন, লগইন, পাসওয়ার্ড রিসেট, রোল ম্যানেজমেন্ট এবং আরও অনেক কিছু পরিচালনা করতে সক্ষম। ASP.Net Core Identity ব্যবহারের জন্য সাধারণত ডাটাবেসে ব্যবহারকারী সম্পর্কিত তথ্য সংরক্ষণ করা হয়।
Identity Configuration
ASP.Net Core Identity কনফিগার করার জন্য Startup.cs ফাইলে নিচের মত কোড ব্যবহার করা হয়:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
এটি ASP.Net Core Identity কনফিগার করে এবং ডাটাবেসে ব্যবহারকারী সম্পর্কিত তথ্য সংরক্ষণের জন্য Entity Framework ব্যবহার করে।
User Registration and Login
ASP.Net Core Identity ব্যবহার করে, আপনি সহজে ব্যবহারকারী রেজিস্ট্রেশন এবং লগইন পদ্ধতি তৈরি করতে পারেন:
public class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public async Task<IActionResult> Register(RegisterViewModel model)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
return View();
}
}
এখানে, একটি নতুন ব্যবহারকারী তৈরি এবং লগইন করার জন্য ASP.Net Core Identity ব্যবহৃত হয়েছে।
সারাংশ
Authentication এবং Authorization দুইটি আলাদা কিন্তু সম্পর্কিত প্রক্রিয়া যা নিরাপত্তার জন্য অত্যন্ত গুরুত্বপূর্ণ। Authentication ব্যবহারকারীর পরিচয় যাচাই করে এবং Authorization তার অনুমতি নির্ধারণ করে। ASP.Net Core-এ বিভিন্ন Authentication পদ্ধতি যেমন Forms Authentication, JWT, এবং External Providers, এবং Authorization পদ্ধতি যেমন Role-based, Policy-based, এবং Claims-based ব্যবহৃত হয়। ASP.Net Core Identity এই দুটি প্রক্রিয়া সহজ এবং নিরাপদভাবে বাস্তবায়ন করতে সাহায্য করে, যা ডেভেলপারদের দ্রুত সিকিউর ওয়েব অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে।
ASP.NET Core Identity একটি শক্তিশালী ফ্রেমওয়ার্ক যা Authentication এবং Authorization সিস্টেম সহজভাবে পরিচালনা করতে সাহায্য করে। এটি user registration, login, role management, এবং password recovery সহ অনেক গুরুত্বপূর্ণ সিকিউরিটি ফিচার প্রোভাইড করে। ASP.NET Core Identity ব্যবহার করে ডেভেলপাররা তাদের ওয়েব অ্যাপ্লিকেশনগুলোর জন্য নিরাপদ এবং স্কেলেবল ইউজার অথেন্টিকেশন ও অথোরাইজেশন সিস্টেম তৈরি করতে পারেন।
ASP.NET Core Identity ফ্রেমওয়ার্ক ডিফল্টভাবে একটি SQL ডেটাবেস ব্যবহার করে ইউজার ডেটা সংরক্ষণ করে, কিন্তু আপনি চাইলে অন্য ডেটাবেস সিস্টেমও ব্যবহার করতে পারবেন। এটি Microsoft.AspNetCore.Identity প্যাকেজের মাধ্যমে ইমপ্লিমেন্ট করা হয় এবং সাধারণত একটি DbContext ক্লাসের মাধ্যমে ডেটাবেসে ব্যবহৃত হয়।
ASP.Net Core Identity এর প্রধান বৈশিষ্ট্যসমূহ
- User Authentication
ASP.NET Core Identity সিস্টেম ইউজারদের যাচাই করে যাতে তারা অ্যাপ্লিকেশনটিতে লগ ইন করতে পারেন। এটি username/password এর মাধ্যমে ইউজার অথেন্টিকেশন প্রক্রিয়া সম্পাদন করে। - Role-based Authorization
ASP.NET Core Identity রোল ভিত্তিক অথোরাইজেশন সমর্থন করে। এর মাধ্যমে আপনি নির্দিষ্ট ইউজারদের নির্দিষ্ট কার্যাবলীতে অনুমতি দিতে পারেন। উদাহরণস্বরূপ, "Admin" রোলের ইউজারদের শুধুমাত্র অ্যাডমিন প্যানেল অ্যাক্সেস দেওয়ার জন্য। - Claims-based Authorization
Identity সিস্টেমে ইউজারের claims (যেমন ইউজারের বয়স, অবস্থান, বা কোনো বিশেষ অনুমতি) ব্যবহার করে অথোরাইজেশন প্রয়োগ করা যায়। - Password Recovery and Reset
Identity সিস্টেম ইউজারের জন্য পাসওয়ার্ড রিসেট করার ফিচার প্রদান করে। যদি ইউজার পাসওয়ার্ড ভুলে যায়, তারা ইমেইল বা টেলিফোনের মাধ্যমে পাসওয়ার্ড রিসেট করতে পারে। - Two-Factor Authentication (2FA)
ASP.NET Core Identity সিস্টেম দুই স্তরের নিরাপত্তা (2FA) সাপোর্ট করে, যেখানে ইউজার তার পাসওয়ার্ডের পাশাপাশি একটি অতিরিক্ত কোড ব্যবহার করে লগ ইন করতে পারেন। এই কোডটি সাধারণত SMS বা ইমেইল মারফত পাঠানো হয়। - External Login Providers
ASP.NET Core Identity গুগল, ফেসবুক, গিটহাব এবং অন্যান্য OAuth 2.0 প্রদানকারীদের মাধ্যমে লগইন করতে সহায়তা করে, যার ফলে ইউজাররা তাদের স্যোশাল মিডিয়া অ্যাকাউন্ট ব্যবহার করে অ্যাপ্লিকেশনে লগ ইন করতে পারেন।
ASP.Net Core Identity সেটআপ এবং কনফিগারেশন
ASP.NET Core Identity ফ্রেমওয়ার্ক ব্যবহার শুরু করার জন্য কিছু নির্দিষ্ট স্টেপ অনুসরণ করতে হয়।
1. Identity প্যাকেজ ইনস্টল করা
প্রথমে আপনাকে Microsoft.AspNetCore.Identity.EntityFrameworkCore প্যাকেজটি ইনস্টল করতে হবে, যা Identity সিস্টেমের সঙ্গে Entity Framework এর ইন্টিগ্রেশন প্রদান করে। Visual Studio-তে NuGet Package Manager ব্যবহার করে এটি ইনস্টল করা যেতে পারে।
Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore
2. Identity DbContext কনফিগারেশন
IdentityDbContext ক্লাসটি ডিফল্টভাবে ব্যবহার করা হয়, যা Identity সম্পর্কিত ডেটা সঞ্চয় এবং পরিচালনা করে। এটি আপনার অ্যাপ্লিকেশন এর DbContext থেকে ইনহেরিট হয়।
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
এখানে, ApplicationUser হলো ইউজার ক্লাস যা আপনি কাস্টমাইজ করতে পারেন।
3. Startup ক্লাসে Identity কনফিগারেশন
Startup.cs ফাইলের মধ্যে Identity কনফিগার করতে হয়। নিচে উদাহরণ দেওয়া হলো:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddControllersWithViews();
}
এখানে AddIdentity মেথড ব্যবহার করে ApplicationUser এবং IdentityRole ক্লাসগুলো কনফিগার করা হয়। এটি ডেটাবেসে ইউজার এবং রোল ম্যানেজমেন্ট সিস্টেম তৈরি করে।
4. Identity Middleware কনফিগারেশন
Configure মেথডে Identity middleware কনফিগার করতে হয়, যা অথেন্টিকেশন এবং অথোরাইজেশন প্রক্রিয়া পরিচালনা করে।
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // Enable Authentication
app.UseAuthorization(); // Enable Authorization
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
UseAuthentication() এবং UseAuthorization() মেথডগুলো ব্যবহার করে লগইন এবং অথোরাইজেশন প্রক্রিয়া সম্পাদন করা হয়।
ASP.Net Core Identity এর ব্যবহার
ASP.NET Core Identity ব্যবহার করে কিছু সাধারণ কার্যাবলী:
1. ইউজার রেজিস্ট্রেশন
public class RegisterModel : PageModel
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
public RegisterModel(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[BindProperty]
public RegisterInputModel Input { get; set; }
public class RegisterInputModel
{
[Required]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
}
public async Task<IActionResult> OnPostAsync()
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = Input.UserName };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToPage("/Index");
}
else
{
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
}
return Page();
}
}
এটি একটি ইউজার রেজিস্ট্রেশন পেজের উদাহরণ, যেখানে UserManager ব্যবহার করে নতুন ইউজার তৈরি করা হয়।
2. ইউজার লগইন
public class LoginModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
public LoginModel(SignInManager<ApplicationUser> signInManager)
{
_signInManager = signInManager;
}
[BindProperty]
public LoginInputModel Input { get; set; }
public class LoginInputModel
{
[Required]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
public async Task<IActionResult> OnPostAsync()
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, false, false);
if (result.Succeeded)
{
return RedirectToPage("/Index");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}
return Page();
}
}
এটি একটি লগইন পেজের উদাহরণ, যেখানে SignInManager ব্যবহার করে ইউজারের লগইন যাচাই করা হয়।
সারাংশ
ASP.NET Core Identity হলো একটি শক্তিশালী সিকিউরিটি ফ্রেমওয়ার্ক, যা অ্যাপ্লিকেশনগুলিতে ইউজার অথেন্টিকেশন এবং অথোরাইজেশন সহজে এবং নিরাপদভাবে বাস্তবায়ন করতে সহায়তা করে। এটি বিভিন্ন নিরাপত্তা ফিচার যেমন User Registration, Login, Role-based Authorization, Password Recovery, এবং Two-Factor Authentication (2FA) সহ ইউজার ম্যানেজমেন্টের জন্য সম্পূর্ণ সম
াধান প্রদান করে। Identity ফ্রেমওয়ার্ক ব্যবহার করে ডেভেলপাররা তাদের অ্যাপ্লিকেশনগুলির নিরাপত্তা কার্যক্রম শক্তিশালী করতে পারে এবং কাস্টম ইউজার মডেল তৈরি ও কনফিগার করতে পারে।
ASP.NET Core-এ Authorization হল একটি গুরুত্বপূর্ণ নিরাপত্তা প্রক্রিয়া যা ব্যবহারকারীদের নির্দিষ্ট রিসোর্স বা অ্যাপ্লিকেশনে অ্যাক্সেস প্রদান বা অস্বীকার করে। দুটি প্রধান ধরনের Authorization পদ্ধতি রয়েছে: Role-based Authorization এবং Policy-based Authorization। চলুন, এগুলোর বিস্তারিত সম্পর্কে জানি।
Role-based Authorization
Role-based Authorization হল একটি সাধারণ এবং জনপ্রিয় পদ্ধতি যেখানে ব্যবহারকারীদের নির্দিষ্ট রোলের ভিত্তিতে অ্যাপ্লিকেশনে বিভিন্ন রিসোর্স বা অ্যাক্সেস অনুমোদন করা হয়। একে Role-based Access Control (RBAC) বলা হয়।
কিভাবে কাজ করে:
- Role: একটি রোল হলো একটি সেট বা ক্যাটাগরি যা ব্যবহারকারীকে নির্দিষ্ট ধরনের কার্যকলাপ বা অ্যাক্সেস প্রদান করে। যেমন, "Admin", "Manager", "User" ইত্যাদি।
- Authorize Attribute: ASP.NET Core-এ, আপনি একটি কন্ট্রোলার বা অ্যাকশনে
[Authorize]অ্যাট্রিবিউট ব্যবহার করে রোল-বেসড অথোরাইজেশন কনফিগার করতে পারেন।
উদাহরণ:
ধরা যাক, আমাদের অ্যাপ্লিকেশনে দুটি রোল আছে: "Admin" এবং "User"। এখানে, Admin রোলের ব্যবহারকারী অ্যাডমিন প্যানেলে প্রবেশ করতে পারবে, কিন্তু User রোলের ব্যবহারকারী তা করতে পারবে না।
[Authorize(Roles = "Admin")]
public IActionResult AdminPanel()
{
return View();
}
[Authorize(Roles = "User")]
public IActionResult UserDashboard()
{
return View();
}
এখানে, AdminPanel শুধুমাত্র Admin রোলের ব্যবহারকারী দেখতে পারবেন, এবং UserDashboard কেবল User রোলের ব্যবহারকারীর জন্যই অ্যাক্সেসযোগ্য।
রোল কনফিগারেশন:
ASP.NET Core-এ রোল তৈরি এবং অ্যাসাইন করতে হলে UserManager এবং RoleManager ব্যবহৃত হয়।
public class SeedData
{
public static async Task Initialize(IServiceProvider serviceProvider, UserManager<ApplicationUser> userManager)
{
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
string[] roleNames = { "Admin", "User" };
foreach (var roleName in roleNames)
{
var roleExist = await roleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
var role = new IdentityRole(roleName);
await roleManager.CreateAsync(role);
}
}
var user = await userManager.FindByEmailAsync("admin@admin.com");
if (user == null)
{
user = new ApplicationUser { UserName = "admin@admin.com", Email = "admin@admin.com" };
await userManager.CreateAsync(user, "Test@123");
}
await userManager.AddToRoleAsync(user, "Admin");
}
}
এটি Admin এবং User রোল তৈরি করবে এবং ব্যবহারকারীকে নির্দিষ্ট রোল প্রদান করবে।
Policy-based Authorization
Policy-based Authorization হল আরও শক্তিশালী এবং নমনীয় একটি পদ্ধতি যা নির্দিষ্ট শর্ত বা নিয়মের ভিত্তিতে ব্যবহারকারীকে অনুমতি দেয়। এটি Claims বা অন্যান্য কাস্টম প্যারামিটার ব্যবহার করে অধিক নমনীয় অ্যাক্সেস কন্ট্রোল প্রদান করে।
কিভাবে কাজ করে:
- Policy: একটি পলিসি হলো একটি সেট বা নিয়ম যা এক বা একাধিক শর্তের ভিত্তিতে Authorization প্রদান করে। পলিসি তৈরি করতে হলে, প্রথমে সেটি কনফিগার করা হয় এবং তারপর অ্যাপ্লিকেশনে পলিসি চেক করা হয়।
- Claims: পলিসি সাধারণত ব্যবহারকারীর Claims (যেমন, নাম, বয়স, বা কাস্টম তথ্য) ব্যবহার করে যাচাই করা হয়।
উদাহরণ:
ধরা যাক, আপনি একটি পলিসি তৈরি করতে চান যা ব্যবহারকারীর বয়স ১৮ বছরের বেশি হলে তাকে একটি নির্দিষ্ট রিসোর্স অ্যাক্সেস দেওয়ার অনুমতি দেয়।
- পলিসি কনফিগারেশন: প্রথমে
ConfigureServicesমেথডে পলিসি কনফিগার করুন।
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("Over18", policy => policy.RequireClaim("Age", "18"));
});
}
এখানে, "Over18" পলিসি সেই ব্যবহারকারীকে অনুমতি দিবে যার Age claim-এ মান "18" অথবা তার বেশি থাকবে।
- পলিসি অ্যাপ্লিকেশন: এখন, আপনি কন্ট্রোলার বা একশন মেথডে এই পলিসি ব্যবহার করতে পারেন।
[Authorize(Policy = "Over18")]
public IActionResult RestrictedArea()
{
return View();
}
এখানে, RestrictedArea পেজে শুধুমাত্র সেই ব্যবহারকারী প্রবেশ করতে পারবে, যাদের Age claim-এ ১৮ অথবা তার বেশি মান থাকবে।
কাস্টম পলিসি:
আপনি নিজের কাস্টম পলিসিও তৈরি করতে পারেন, যেখানে শর্ত হিসেবে ব্যবহারকারীর বিভিন্ন বৈশিষ্ট্য বা Claims যাচাই করা হয়।
services.AddAuthorization(options =>
{
options.AddPolicy("MustBeAdmin", policy =>
policy.RequireAssertion(context =>
context.User.HasClaim(c => c.Type == "Role" && c.Value == "Admin"));
});
এই কাস্টম পলিসি চেক করবে, ব্যবহারকারীর Role claim-এ "Admin" মান আছে কিনা।
সারাংশ
Role-based Authorization এবং Policy-based Authorization উভয়ই ASP.NET Core-এ শক্তিশালী অথোরাইজেশন পদ্ধতি। Role-based Authorization সোজা এবং ব্যবহার করা সহজ, যেখানে আপনি নির্দিষ্ট রোলের ভিত্তিতে অ্যাক্সেস কন্ট্রোল করেন। অন্যদিকে, Policy-based Authorization বেশি নমনীয় এবং কাস্টম শর্তে ভিত্তি করে অ্যাক্সেস নিয়ন্ত্রণ করতে সক্ষম। এই দুটি পদ্ধতি একে অপরকে পরিপূরক হিসেবে কাজ করে এবং নিরাপত্তা ব্যবস্থাকে আরও শক্তিশালী করে তোলে।
JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড যা ক্লাইন্ট এবং সার্ভারের মধ্যে নিরাপদে তথ্য বিনিময় করতে ব্যবহৃত হয়। এটি সাধারণত Authentication এবং Authorization প্রক্রিয়ার জন্য ব্যবহৃত হয়। JWT টোকেন একটি এনক্রিপ্টেড বা সিগনেচার করা স্ট্রিং যা টোকেনের ভিতরে কিছু গুরুত্বপূর্ণ তথ্য ধারণ করে, যেমন ব্যবহারকারীর পরিচয় এবং তাদের অ্যাক্সেসের অনুমতি।
JWT ব্যবহার করার মাধ্যমে, একবার ব্যবহারকারী লগইন করলে, সার্ভার একটি JWT টোকেন জেনারেট করে এবং ব্যবহারকারীকে পাঠিয়ে দেয়, যা পরে পরবর্তী প্রতিটি রিকোয়েস্টের সঙ্গে ক্লাইন্ট দ্বারা সার্ভারে পাঠানো হয়। সার্ভার এই টোকেন যাচাই করে ব্যবহারকারীর পরিচয় নিশ্চিত করে এবং সঠিকভাবে এক্সেস প্রদান করে।
JWT এর গঠন
একটি JWT টোকেন তিনটি প্রধান অংশে বিভক্ত থাকে:
- Header:
- টোকেনের প্রকার এবং সিগনেচার অ্যালগরিদম (যেমন HMAC SHA256 অথবা RSA) উল্লেখ করে।
উদাহরণ:
{ "alg": "HS256", "typ": "JWT" }
- Payload:
- এতে টোকেনের মধ্যে সংরক্ষিত তথ্য বা Claims থাকে। Claims হলো এমন কিছু তথ্য যা টোকেনের মাধ্যমে পাঠানো হয়, যেমন ব্যবহারকারীর পরিচয়, অ্যাক্সেসের অনুমতি ইত্যাদি।
উদাহরণ:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }- এখানে
"sub"হল subject (ব্যবহারকারীর ID),"name"ব্যবহারকারীর নাম এবং"iat"হল "issued at" টাইমস্ট্যাম্প।
- Signature:
- এটি টোকেনের অখণ্ডতা এবং নিরাপত্তা নিশ্চিত করে। সার্ভারের সিক্রেট কী ব্যবহার করে Header এবং Payload এর একটি এনক্রিপ্টেড সিগনেচার তৈরি করা হয়। এটি নিশ্চিত করে যে টোকেনের তথ্য কোনোভাবে পরিবর্তিত হয়নি।
উদাহরণ:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT একটি বেস64 এন্কোডেড স্ট্রিং হিসেবে তিনটি অংশে বিভক্ত হয়ে থাকে, এবং সাধারণত এটি এইরকম দেখায়:
header.payload.signature
JWT Authentication Flow
- Login Request:
- ব্যবহারকারী তাদের ব্যবহারকারী নাম এবং পাসওয়ার্ড দিয়ে সার্ভারে একটি রিকোয়েস্ট পাঠায়।
- সার্ভার পাসওয়ার্ড যাচাই করে এবং সঠিক হলে JWT টোকেন জেনারেট করে।
- JWT Generation:
- সার্ভার JWT টোকেন জেনারেট করে, যাতে ব্যবহারকারীর তথ্য থাকে (যেমন, ID, রোল ইত্যাদি), এবং এই টোকেনটি ক্লাইন্টকে পাঠায়।
- Send JWT with Requests:
- ক্লাইন্ট এই JWT টোকেনটি পরবর্তী HTTP রিকোয়েস্টে Authorization Header এর মাধ্যমে পাঠায়।
উদাহরণ:
Authorization: Bearer <token>
- Token Validation:
- সার্ভার রিকোয়েস্ট প্রাপ্তির পর, টোকেনটি যাচাই করে। যদি টোকেনটি সঠিক এবং বৈধ হয়, তাহলে সার্ভার ব্যবহারকারীকে অ্যাক্সেস প্রদান করে।
- সার্ভার সিক্রেট কী বা পাবলিক কী ব্যবহার করে টোকেনটির সিগনেচার যাচাই করে।
- Access Granted:
- টোকেনটি বৈধ হলে, সার্ভার রিকোয়েস্টে অ্যাক্সেস প্রদান করে, যেমন ডেটা পাঠানো বা কোনো এক্সপেন্সিভ রিসোর্সে অ্যাক্সেস।
JWT এর সুবিধা
- Stateless Authentication:
- JWT একটি স্টেটলেস Authentication প্রক্রিয়া, যেখানে সার্ভার ব্যবহারকারীর সেশন বা অবস্থান ট্র্যাক করে না। ব্যবহারকারী সার্ভারে বারবার লগইন না করে শুধুমাত্র টোকেন ব্যবহার করে সব রিকোয়েস্ট করতে পারে।
- Scalability:
- যেহেতু JWT এর মধ্যে সমস্ত তথ্য সংরক্ষিত থাকে, এটি সার্ভার সাইডে কোনো সেশন স্টোর করার প্রয়োজন নেই, তাই সিস্টেম আরও স্কেলেবল হয়।
- Cross-platform Support:
- JWT একটি ওপেন স্ট্যান্ডার্ড হওয়ায়, এটি বিভিন্ন প্ল্যাটফর্ম এবং ভাষায় সহজেই ব্যবহার করা যায়, যেমন Node.js, Java, Python, এবং .NET।
- Security:
- JWT এনক্রিপ্টেড বা সিগনেচার করা থাকে, তাই এটি সুরক্ষিত। এছাড়া, টোকেনটি নির্দিষ্ট সময়ের জন্য বৈধ থাকে (exp - expiration time), যা এক্সপায়ার হলে পুনরায় লগইন করতে হয়।
JWT Authentication এর বাস্তব প্রয়োগ
ASP.NET Core অ্যাপ্লিকেশনে JWT Authentication সেটআপ করার জন্য আপনাকে কিছু নির্দিষ্ট স্টেপ অনুসরণ করতে হবে:
Install NuGet Packages:
- JWT Authentication ব্যবহার করতে
Microsoft.AspNetCore.Authentication.JwtBearerপ্যাকেজ ইনস্টল করুন।
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer- JWT Authentication ব্যবহার করতে
Configure JWT Authentication in Startup.cs:
Startup.csফাইলে Authentication মেথড কনফিগার করুন:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "yourIssuer", ValidAudience = "yourAudience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey")) }; }); }Generate JWT Token:
- লগইন বা রেজিস্ট্রেশনের পরে JWT টোকেন জেনারেট করুন:
public string GenerateJWT(User user) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.UserId.ToString()), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey")); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: "yourIssuer", audience: "yourAudience", claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); }- Use JWT in Requests:
- JWT টোকেনটি ক্লাইন্ট থেকে সার্ভারে পাঠান। সাধারণত এটি Authorization Header এর মাধ্যমে করা হয়।
সারাংশ
JWT (JSON Web Token) হল একটি স্ট্যান্ডার্ড যা নিরাপদ এবং স্টেটলেস অথেন্টিকেশন সিস্টেম তৈরির জন্য ব্যবহৃত হয়। এটি ক্লাইন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান সহজতর করে এবং নিরাপত্তা নিশ্চিত করে। JWT সার্ভারের উপর কোনো স্টেট ধারণ করে না, ফলে এটি বেশি স্কেলেবল এবং ফাস্ট। ASP.NET Core অ্যাপ্লিকেশনে JWT Authentication সেটআপ করতে কিছু নির্দিষ্ট কনফিগারেশন এবং কোড প্রয়োজন, যা সার্ভারের উপর ব্যবহারকারীর অ্যাক্সেস কন্ট্রোল এবং সুরক্ষা নিশ্চিত করে।
OAuth এবং OpenID Connect হলো দুটি জনপ্রিয় অথেন্টিকেশন ও অথরাইজেশন প্রোটোকল যা আধুনিক ওয়েব অ্যাপ্লিকেশন এবং API নিরাপত্তায় গুরুত্বপূর্ণ ভূমিকা পালন করে। ASP.NET Core অ্যাপ্লিকেশনগুলিতে নিরাপত্তা সংক্রান্ত কাজের জন্য এই প্রোটোকলগুলির ইন্টিগ্রেশন খুবই সহজ এবং শক্তিশালী।
OAuth কী?
OAuth (Open Authorization) একটি অথরাইজেশন ফ্রেমওয়ার্ক যা ইউজারের ক্রেডেনশিয়াল না নিয়ে তৃতীয় পক্ষের অ্যাপ্লিকেশনকে ইউজারের রিসোর্স অ্যাক্সেসের অনুমতি দেয়। এই প্রোটোকল মূলত অ্যাপ্লিকেশনের মধ্যে সুরক্ষিত ডেটা শেয়ার করার জন্য ব্যবহৃত হয়।
উদাহরণস্বরূপ, আপনি যদি একটি অ্যাপ্লিকেশনে গুগল বা ফেসবুক অ্যাকাউন্ট ব্যবহার করে লগ ইন করেন, তবে এটি OAuth প্রোটোকলের মাধ্যমে ঘটে। OAuth ইউজারকে তার ক্রেডেনশিয়াল (যেমন, পাসওয়ার্ড) সরাসরি শেয়ার না করে তৃতীয় পক্ষের অ্যাপ্লিকেশনকে এক্সেস টোকেন প্রদান করে। এই টোকেনটি ব্যবহার করে অ্যাপ্লিকেশন নির্দিষ্ট রিসোর্স (যেমন, ইউজারের প্রোফাইল বা ফটো) অ্যাক্সেস করতে পারে।
OpenID Connect কী?
OpenID Connect (OIDC) হল OAuth 2.0 এর উপর একটি লেয়ার যা অথেন্টিকেশন প্রদান করে। OAuth শুধুমাত্র অথরাইজেশন দিয়ে থাকে, তবে OpenID Connect ইউজারের পরিচয় যাচাই করার জন্য একটি শীর্ষ স্তরের প্রটোকল সরবরাহ করে। এটি ইউজারের লগইন প্রক্রিয়া সহজ করে তোলে এবং অ্যাপ্লিকেশনকে নিশ্চিত করতে সহায়তা করে যে তারা যে ইউজারের পরিচয় যাচাই করছে, সেই ইউজারের আসলই বা না।
যদি OAuth একটি এক্সেস টোকেন প্রদান করে, তবে OpenID Connect একটি ID Token প্রদান করে যা ইউজারের পরিচয় নিশ্চিত করে।
OAuth এবং OpenID Connect ইন্টিগ্রেশন ASP.NET Core-এ
ASP.NET Core-এ OAuth এবং OpenID Connect ইন্টিগ্রেশন করার জন্য, আপনি ASP.NET Core Identity এবং Authentication Middleware ব্যবহার করতে পারেন। এর মাধ্যমে আপনি গুগল, ফেসবুক, গিটহাব বা অন্য কোনো আইডেন্টিটি প্রোভাইডারের সাথে সিঙ্ক্রোনাইজ করতে পারবেন।
OAuth এবং OpenID Connect কনফিগারেশন
NuGet প্যাকেজ ইনস্টলেশন:
প্রথমে, ASP.NET Core অ্যাপ্লিকেশনে OAuth এবং OpenID Connect ইন্টিগ্রেশন করার জন্য
Microsoft.AspNetCore.Authentication.OAuthএবংMicrosoft.AspNetCore.Authentication.OpenIdConnectপ্যাকেজ ইনস্টল করুন।dotnet add package Microsoft.AspNetCore.Authentication.OAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnectStartup.cs কনফিগারেশন:
Startup.csফাইলে Authentication Middleware কনফিগার করা হবে। এখানে OpenID Connect প্রোভাইডার কনফিগার করা হচ্ছে।public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(options => { options.LoginPath = "/Account/Login"; }) .AddOpenIdConnect(options => { options.Authority = "https://identityprovider.com"; // Identity provider URL options.ClientId = "YourClientId"; options.ClientSecret = "YourClientSecret"; options.ResponseType = "code"; options.SaveTokens = true; options.Scope.Add("openid"); options.Scope.Add("profile"); options.Scope.Add("email"); options.CallbackPath = "/signin-oidc"; }); }এখানে:
- Authority: এখানে আপনাকে প্রোভাইডারের অথেন্টিকেশন URL দিতে হবে (যেমন গুগল বা মাইক্রোসফট অ্যাকাউন্টের URL)।
- ClientId এবং ClientSecret: এই দুটি আপনি প্রোভাইডারের ডেভেলপার কনসোল থেকে পাবেন।
- CallbackPath: যেখানে প্রোভাইডার রিডাইরেক্ট করবে যখন অথেন্টিকেশন সফল হবে।
Authentication চ্যালেঞ্জ:
আপনি যখন ইউজারকে অথেন্টিকেট করতে চান, তখন ChallengeAsync মেথড ব্যবহার করতে হবে।
public async Task<IActionResult> Login() { await HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); return RedirectToAction("Index", "Home"); }এই কোডটি ইউজারকে OpenID Connect প্রোভাইডারে রিডাইরেক্ট করবে।
Logout:
Logout প্রক্রিয়াটি এমনভাবে কনফিগার করা হয় যাতে ইউজারকে সিস্টেম থেকে লগ আউট করার পর প্রোভাইডারের সেশনও শেষ হয়ে যায়।
public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); return RedirectToAction("Index", "Home"); }
OAuth এবং OpenID Connect ব্যবহারের সুবিধা
- নিরাপত্তা: ইউজারের পাসওয়ার্ড কখনো তৃতীয় পক্ষের অ্যাপ্লিকেশনের কাছে সরাসরি শেয়ার করা হয় না, ফলে নিরাপত্তা নিশ্চিত হয়।
- সহজ লগইন: ইউজারদের জন্য বিভিন্ন সোসাল প্ল্যাটফর্ম যেমন গুগল, ফেসবুক, গিটহাব ইত্যাদি থেকে লগইন করার সুবিধা প্রদান করা হয়।
- Scalability: এটি বিভিন্ন অ্যাপ্লিকেশন এবং সার্ভিসের মধ্যে একক লগইন ব্যবস্থা (SSO) প্রদান করতে সক্ষম।
- ডেটা শেয়ারিং: প্রোভাইডার বা সিস্টেমের বাইরে ডেটা শেয়ার করা সহজ হয়ে যায় এবং এই প্রক্রিয়াটি নিরাপদ থাকে।
সারাংশ
OAuth এবং OpenID Connect আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির নিরাপত্তা এবং ইউজার অথেন্টিকেশন সহজ এবং নিরাপদ করে তোলে। ASP.NET Core-এ এই দুটি প্রোটোকলকে ইন্টিগ্রেট করা অনেক সহজ এবং এটি একটি স্কেলেবল অথেন্টিকেশন ব্যবস্থা প্রদান করে, যা ব্যবহারকারীদের তাদের সামাজিক অ্যাকাউন্টের মাধ্যমে দ্রুত এবং নিরাপদ লগইন করার সুযোগ দেয়।
Read more